/********************************************************************************
 * Copyright (c)2016-2020, ShenZhen WanJiaAn Technology CO.,LTD.
 * All Rights Reserved.
 *
 * File Name     : DevSocSub.h
 * Author        : joki.zhu
 * Date          : 2020-07-03
 *
 * Record        :
 * 1.Date        : 2020-07-03
 *   Author      : joki.zhu
 *   Modification: Created file
 ********************************************************************************/

#ifndef __DEVSOCSUB_H__
#define __DEVSOCSUB_H__

#include "System.h"
#include "DevWifi.h"
#include "hi_hal_syslink.h"

#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */

typedef enum {
	SYS_WAKEUP_TYPE_POWER_ON = 0,   /**< 上电唤醒 */
	SYS_WAKEUP_TYPE_KEY_BELL,    	/**< 门铃按键唤醒 */
	SYS_WAKEUP_TYPE_KEY_PICK,       /**< 防撬报警按键唤醒 */
	SYS_WAKEUP_TYPE_KEY_NETCFG,     /**< 网络配网按键唤醒 */
	SYS_WAKEUP_TYPE_PIR,    		/**< PIR唤醒 */
	SYS_WAEKUP_TYPE_ALARM,  		/**< 定时唤醒，处理完立刻休眠 */
	SYS_WAKEUP_TYPE_WIFI,   		/**< wifi远程唤醒 */
	SYS_WAKEUP_TYPE_LOW_POWER,		/**< 电池低电唤醒 */
	SYS_WAKEUP_TYPE_WDT,			/**< 看门狗唤醒 */
	SYS_WAKEUP_TYPE_USB_CHARGE, 	/**< USB充电唤醒 */
	SYS_WAKEUP_TYPE_RECOVERY_WIFI,  /**< 恢复wifi唤醒,处理完立刻休眠 */
	SYS_WAKEUP_TYPE_BUFF,
}SYSTEM_WAKEUP_TYPE_E;

/**
 * 定义电池充电状态
 */
typedef enum {
	BAT_DISCHARGING = 0,                        /**< 没有充电, 放电中 */
	BAT_CHARGING,                               /**< 电池充电中 */
	BAT_FULL,                                   /**< 电池已充满 */
} BAT_CHARGING_STATUS;

/**
 * 定义电池状态
 */
typedef struct {
	int capacity;                               /**< 电池电量数据 */
	BAT_CHARGING_STATUS chargingStatus;         /**< 电池充放电状态 */
    int isLowBatState;                          /**< 低电状态标志, 1:低电 0:非低电 */
}BATTERY_STATUS_S;


/**
 * MCU系统配置
 */
typedef struct {
    AV_U8 socStartMaxSecond;       //SOC 启动超时时间 单位s
    AV_U8 pirAlarmSwith;           //PIR 告警开关
    AV_U8 pirAlarmInterval;        //PIR 告警间隔.
    AV_U8 pirSensibility;          //PIR 灵敏度.
    AV_U8 batteryLevel1Cfg;        //电池电量1.  20
    AV_U8 batteryLevel2Cfg;        //电池电量2.  12
    AV_U8 batteryLevel3Cfg;        //电池电量3.  10
    AV_U8 keyResetTimeSeconds;     //长按时间阈值S
    AV_U8 stopchecksocalive;	   //是否停止检测SOC活跃状态，用在调试或升级时
    AV_U8 longAlive;               //是否常电模式
}SOCSUB_SYS_CONFIG_S;


/**
 * MCU定时唤醒属性
 */
typedef struct {
    AV_U8 minute;   /**< 分钟 */
    AV_U8 hour;     /**< 小时 */
    AV_U8 bEnable;  /**< 开关 */
    AV_U8 reserved; /**< 预留 */
}SOCSUB_ALARM_WAKEUP_ATTR_S;


/**
 * PIR延时唤醒属性
 */
typedef struct {
    AV_U8 detectTimeSec;    /**< 延时侦测总时长(秒) */
    AV_U8 triggerTimeSec;   /**< 延时期间触发时长(秒) */
    AV_U8 intervalTimeSec;  /**< PIR告警最小时间间隔(秒) */
    AV_U8 reserved;         /**< 预留 */
}PIR_DELAY_WAKEUP_ATTR_S;

int SocSubSetLedState(unsigned char value);

int SocSubSetPirSwitch(char bEnable);
int SocSubGetPirSwitch(char *bEnable);
int SocSubGetPirSensitivity(int *pValue);
int SocSubSetPirSensitivity(int value);
int SocSubSetPirDelayWakeupTime(PIR_DELAY_WAKEUP_ATTR_S stPirDelayAttr);
int SocSubGetPirDelayWakeupTime(PIR_DELAY_WAKEUP_ATTR_S *pstPirDelayAttr);

int SocSubGetBatteryStatus(BATTERY_STATUS_S *pstBatStatus);
int SocSubGetWakeUpType(SYSTEM_WAKEUP_TYPE_E *pWakeUpType);

int SocSubGetTime(SYSTEM_TIME *pstSysTime);
int SocSubSetTime(SYSTEM_TIME stSysTime);

int SocSubSetReset(char *reason);

/**
 * @brief WiFi模块上电
 *
 * @param 无
 * 
 * @return |0|未升级| |非0|失败|
 *
 * @attention 无
 */
int SocSubSetWifiPowerOn(void);

/**
 * @brief WiFi模块下电
 *
 * @param 无
 * 
 * @return |0|未升级| |非0|失败|
 *
 * @attention 无
 */
int SocSubSetWifiPowerOff(void);

/**
 * @brief 设置WiFi电源开关
 *
 * @param 无
 * 
 * @return |0|未升级| |非0|失败|
 *
 * @attention 无
 */
int SocSubSetWifiPowerSwitch(unsigned char switchState);

/**
 * @brief 主控下电
 *
 * @param 无
 * 
 * @return |0|未升级| |非0|失败|
 *
 * @attention 无
 */
int SocSubSetMainSocPowerOff(void);

/**
 * @brief 主控维持自身电源
 *
 * @param 无
 * 
 * @return |0|未升级| |非0|失败|
 *
 * @attention 无
 */
int SocSubSetMainSocKeepPower(void);

/**
 * @brief 设置MCU看门狗使能状态
 *
 * @param[in] bEnalbe 使能状态 0:禁用 1:使能
 * 
 * @return |0|未升级| |非0|失败|
 *
 * @attention 无
 */
int SocSubSetWdgState(char bEnable);

/**
 * @brief 获取MCU看门狗使能状态
 *
 * @param[in] pState 状态 0:未使能 1:已使能
 * 
 * @return |0|未升级| |非0|失败|
 *
 * @attention 无
 */
int SocSubGetWdgState(char *pState);

/**
 * @brief 配置MCU看门狗周期
 *
 * @param[in] time 看门狗周期时间
 * 
 * @return |0|未升级| |非0|失败|
 *
 * @attention 无
 */
int SocSubSetWdgPeriod(AV_U32 time);

/**
 * @brief MCU喂狗
 *
 * @param 无
 * 
 * @return |0|未升级| |非0|失败|
 *
 * @attention 无
 */
int SocSubSetWdgFeed(void);


int SocSubSetWifiState(char state);
int SocSubGetWifiState(char *pState);

int SocSubSetSysConfig(SOCSUB_SYS_CONFIG_S stMcuSysConfig);
int SocSubGetSysConfig(SOCSUB_SYS_CONFIG_S *pstMcuSysConfig);

int SocSubSetAlarmWakeup(SOCSUB_ALARM_WAKEUP_ATTR_S stAlarmWakeupAttr);
int SocSubGetAlarmWakeup(SOCSUB_ALARM_WAKEUP_ATTR_S *pstAlarmWakeupAttr);

/**
 * @brief 配置MCU监控SOC启动的时间
 *
 * @param[in] timeSec 监控描述
 * 
 * @return |0|未升级| |非0|失败|
 *
 * @attention 超过监控时间,即从启动到设置的监控时间内,都没有和MCU通信,则MCU会重启SOC
 */
int SocSubSetMainSocStartDetectTime(int timeSec);

int SocSubCheckIsSupportUpdate(void);

int SocSubGetVersion(char *pVersion);

/**
 * @brief 清除唤醒事件
 *
 * @param 无
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 通知给MCU清除唤醒状态,另休眠时mcu也会主动清除,防止下次唤醒获取唤醒类型不正确
 */
int SocSubSetClearWakeupEvent(void);

int SocSubGetTemperature(float *pTempValue);

int SocSubInit(void);

int SocSubDeinit(void);

int SocSubWifiConnect(char *ssid, char *pwd, WIFI_ENCRYPT_TYPE_E enEncryptType);
int SocSubWifiDisconnect(void);
int SocSubWifiGetStatus(WIFI_STATUS_INFO_S *pstStatusInfo);
int SocSubSetSystemMode(HI_SYSLINK_SYS_MODE enSysMode);

int SocSubCheckIsUpgrading(void);
int SocSubUpgradeStart(char type, int pktSize, char *crc);
int SocSubUpgradeTransmit(unsigned char *buf, unsigned int size);
int SocSubUpgradeFinish(char *bootcrc, char *kernelcrc);
int SocSubSetResetSwitch(char bEnable);


#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */


#endif /* __DEVSOCSUB_H__ */
